enum Types {
  Red = 0,
  Green = 1,
  BLue = 2,
}
//默认就是从0开始的 可以不写值

// 增长枚举
enum Types1 {
  Red = 1,
  Green,
  BLue,
}
//每个成员都必须用字符串字面量
enum Types2 {
  Red = 'red',
  Green = 'green',
  BLue = 'blue',
}
//异构枚举 枚举可以混合字符串和数字成员
enum Types4 {
  No = 'No',
  Yes = 1,
}
/* 接口枚举
定义一个枚举Types 定义一个接口A 他有一个属性red 值为Types.yyds
声明对象的时候要遵循这个规则 */
enum Types5 {
  yyds, //0
  dddd,
}
interface ATypes5 {
  red: Types5.yyds
}

let obj: ATypes5 = {
  red: Types5.yyds,
}
console.log(obj)

/* 
const枚举
let  和 var 都是不允许的声明只能使用const
大多数情况下，枚举是十分有效的方案。 然而在某些情况下需求很严格。 为了避免在额外生成的代码上的开销和额外的非直接的对枚举成员的访问，我们可以使用 const枚举。 常量枚举通过在枚举上使用 const修饰符来定义
const 声明的枚举会被编译成常量
普通声明的枚举编译完后是个对象
 */
const enum Types6{
  No = "No",
  Yes = 1,
}

/* 
反向映射
它包含了正向映射（ name -> value）和反向映射（ value -> name）
要注意的是 不会为字符串枚举成员生成反向映射。
 */
enum Enum1 {
  fall
}
let aEnum1 = Enum1.fall;
console.log(aEnum1); //0
let nameOfA = Enum1[aEnum1]; 
console.log(nameOfA); //fall